package com.kt.thread.demo.exercises;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * Created by tangwy on 2016/1/21.
 */
/*
第一题：现有的程序代码模拟产生了16个日志对象，
        并且需要运行16秒才能打印完这些日志，
        请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象，
        程序只需要运行4秒即可打印完这些日志对象。原始代码如下：*/
public class Demo1 {
    public static void main() {
        //思路:打印log的代码和创建对象的循环不能改，那么就不能在循环内打印了，
        // 只有把数据拿出来，存起来，然后让线程去取，再调用打印方法
        final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(16);
        System.out.println("begin:" + (System.currentTimeMillis() / 1000));
            /*模拟处理16行日志，下面的代码产生了16个日志对象，当前代码需要运行16秒才能打印完这些日志。
			修改程序代码，开四个线程让这16个对象在4秒钟打完。
			*/
        for (int i = 0; i < 16; i++) {  //这行代码不能改动
            final String log = "" + (i + 1);//这行代码不能改动
            {
                //原始代码
                //Demo1.parseLog(log);
                //更改后的代码
                queue.add(log);
            }
        }
        //新增的打印代码
        for (int i = 0; i < 4; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true){
                        try {
                            String log = queue.take();
                            parseLog(log);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    }

    //parseLog方法内部的代码不能改动
    public static void parseLog(String log) {
        System.out.println(log + ":" + (System.currentTimeMillis() / 1000));

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
